package com.me.service;

import java.util.List;

import org.springframework.util.Assert;

import com.me.dao.BaseDAO;
import com.me.entity.BaseEntity;
import com.me.vo.Page;

public abstract class BaseService <E extends BaseEntity, D extends BaseDAO<E>> {
	
	/**
	 * 模板设计模式：从子类获取具体DAO的实现类
	 */
	abstract protected D getDao();
	
	/*************************模糊查询*************************/
	
	/**分页+排序+模糊查询*/
	public Page queryPage(E e){
		Assert.notNull(e);
		Page page = new Page();
		// 设置分页对象
		page.setPage(e.getPageIndex());
		page.setRows(e.getPageSize());
		page.setTotalCount(getDao().count(e));
		page.setData(getDao().query(e));
		return page;
	}
	
	/**排序+模糊查询*/
	public List<E> query(E e){
		Assert.notNull(e);
		Assert.isNull(e.getPageIndex());
		Assert.isNull(e.getPageSize());
		return getDao().query(e);
	}

	/*************************精确查询*************************/
	
	/**查询全部*/
	public List<E> queryAll(){
		return getDao().preciseQuery(null);
	}
	
	/**查询总记录数*/
	public Integer countAll(){
		return getDao().preciseCount(null);
	}
	
	/**根据主键查询*/
	public E queryById(Integer id){
		return getDao().queryById(id);
	}
	
	/***********************基本DML操作***********************/
	
	/**添加*/
	public void insert(E e) throws Exception{
		Assert.notNull(e);
		getDao().insert(e);
	}
	
	/**修改*/
	public void update(E e) throws Exception{
		Assert.notNull(e);
		getDao().update(e);
	}
	
	/**删除*/
	public void delete(E e) throws Exception{
		Assert.notNull(e);
		getDao().delete(e);
	}
	
	/**按照主键删除*/
	public void delete(Integer id) throws Exception{
		Assert.notNull(id);
		getDao().deleteById(id);
	}
}
